/*
 * ManejadorPermiso.java
 */
package servlets;

import beans.*;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.*;

import dbUtil.*;
import iteradores.*;

/**
 *
 * @author Administrador
 */
public class ManejadorRolaUsuario extends HttpServlet {

    private String nombreModulo = "rolausuario";
    private IteradorUsuario usuarioActual;

    /** Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html");
        response.setCharacterEncoding("windows-1252");
        PrintWriter out = response.getWriter();
        String url = null;

        try {
            //Datos del usuario actual de la sesion, si esto es nulo significa
            //que aun no hizo login
            usuarioActual = (IteradorUsuario) request.getSession().getAttribute("usuarioActual");
            if (usuarioActual == null) {
                url = "login.jsp"; //Volver a loguearse

            } else {
                // Obtiene la conexión a la base de datos de la sesión
                Connection con = (Connection) request.getSession().getAttribute("ConexionBd");
                //Obtiene la operación a realizar 
                String str_op = request.getParameter("op");

                if (str_op != null) {
                    //Objeto que averigua si el usuario tiene rolausuario para acceder al servlet.
                    PgAbm testPermiso = new PgAbm();
                    testPermiso.setCon(con);

                    usuarioActual.getReset();
                    usuarioActual.getNext();
                    if (testPermiso.tienePermiso(nombreModulo,
                            usuarioActual.getNombreusuario(),
                            str_op.substring(0, 6))) {
                        url = "rolausuario.jsp?modo=ASIGNA";

                        if (str_op.equals("SELECT")) {
                            url = this.select_data(con, request, response);
                        } else if (str_op.equals("INSERT")) {
                            url = this.insert_data(con, request, response);
                        } else if (str_op.equals("DELETE")) {
                            url = this.delete_data(con, request, response);
                        }
                    } else {
                        url = "sinpermiso.jsp";
                    }
                } else {
                    url = "admin.jsp";
                }
            }
            mostrar_pagina(url, request, response);
        } catch (Exception e) {
            e.printStackTrace(out);
        }
    }

    public void mostrar_pagina(String url, HttpServletRequest req, HttpServletResponse resp)
            throws Exception {
        RequestDispatcher disp = req.getRequestDispatcher(url);
        resp.setHeader("Cache-Control", "no-cache");
        resp.setCharacterEncoding("windows-1252");
        resp.setHeader("Pragma", "no-cache");
        resp.setIntHeader("Expires", 0);
        disp.forward(req, resp);
    }

    public DBConfig getDataBaseConfig() {
        ServletContext scon = getServletContext();
        DBConfig dc = new DBConfig();
        dc.setDbname(scon.getInitParameter("dbname"));
        dc.setServer(scon.getInitParameter("dbserver"));
        dc.setUser(scon.getInitParameter("dbuser"));
        dc.setPass(scon.getInitParameter("dbpass"));
        return dc;
    }

    //<editor-fold defaultstate="collapsed" desc="Métodos ABM (SELECT, INSERT, UPDATE y DELETE).">
    public String select_data(Connection con, HttpServletRequest request, HttpServletResponse response) throws Exception {
        String url = "rolausuario.jsp?modo=ASIGNA";
        String idusuario = (String) request.getParameter("idusuario");

        String sql = "";
        Statement stm = null;

        con.setAutoCommit(false);

        if (idusuario != null) {
            sql = "select ur.idusuario, u.nombreusuario as usuario, ur.idrol, r.descripcion as rol" +
                    " from usuario_rol ur " +
                    " join usuario u on ur.idusuario = u.idusuario" +
                    " join rol r on ur.idrol = r.idrol" +
                    " where ur.idusuario = " + idusuario +
                    " order by nombreusuario ";

            stm = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
                    ResultSet.CONCUR_READ_ONLY);

            System.out.println(sql);
            ResultSet result = stm.executeQuery(sql);

            IteradorRolaUsuario ur = new IteradorRolaUsuario(result);
            request.setAttribute("RolesUsuario", ur);

            sql = " select idrol, descripcion as rol, (select idusuario from usuario where idusuario = " + idusuario + ") as idusuario," +
                    " (select nombreusuario from usuario where idusuario = " + idusuario + ") as usuario " +
                    " from rol " +
                    " where idrol not in (select idrol from usuario_rol where idusuario = " + idusuario + ");";

            stm = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
                    ResultSet.CONCUR_READ_ONLY);

            System.out.println(sql);
            ResultSet result2 = stm.executeQuery(sql);

            IteradorRolaUsuario rmp = new IteradorRolaUsuario(result2);

            if (rmp.getCantidad() == 0) {
                sql = " select idrol, descripcion as rol, (select idusuario from usuario where idusuario = " + idusuario + ") as idusuario," +
                        " (select nombreusuario from usuario where idusuario = " + idusuario + ") as usuario " +
                        " from rol;";

                stm = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
                        ResultSet.CONCUR_READ_ONLY);

                System.out.println(sql);
                result2 = stm.executeQuery(sql);

                rmp = new IteradorRolaUsuario(result2);
            }

            request.setAttribute("RolesFaltantes", rmp);
        }

        Usuario usuario = new Usuario();
        usuario.setCon(con);
        usuario.getUsuarios(usuarioActual.getIdUsuario(), "!=");

        IteradorUsuario itm = (IteradorUsuario) usuario.getIteratorAll();
        request.setAttribute("Usuarios", itm);

        return url;
    }

    public String insert_data(Connection con, HttpServletRequest request, HttpServletResponse response) throws Exception {
        String url = "rolausuario.jsp?modo=INSERT";
        String idrol = request.getParameter("idrol");
        String idusuario = request.getParameter("idusuario");

        String sql = "";
        Statement stm = null;

        con.setAutoCommit(false);

        if (idusuario != null && idrol != null) {
            sql = "INSERT INTO usuario_rol SELECT " + idusuario + "," + idrol + ", user, now();";

            stm = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
                    ResultSet.CONCUR_READ_ONLY);

            System.out.println(sql);
            int cant = stm.executeUpdate(sql);
            System.out.println("Fila ingresada: " + cant);
            con.commit();

            url = select_data(con, request, response);
        }
        return url;
    }

    public String delete_data(Connection con, HttpServletRequest request, HttpServletResponse response) throws Exception {
        String url = "";
        String idrol = request.getParameter("idrol");
        String idusuario = request.getParameter("idusuario");

        String sql = "";
        Statement stm = null;

        con.setAutoCommit(false);

        if (idusuario != null && idrol != null) {
            sql = "DELETE FROM usuario_rol where idrol = " + idrol + " and idusuario = " + idusuario + ";";

            stm = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
                    ResultSet.CONCUR_READ_ONLY);

            System.out.println(sql);
            int cant = stm.executeUpdate(sql);
            System.out.println("Fila borrada: " + cant);
            con.commit();

            url = select_data(con, request, response);
        }
        return url;
    }
    //</editor-fold>
    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    @Override
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
    }

    @Override
    public void destroy() {
    }

    /** Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /** Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /** 
     * Returns a short description of the servlet.
     */
    @Override
    public String getServletInfo() {
        return "Este servlet maneja las peticiones sobre la tabla Permiso";
    }
// </editor-fold>
}
